package sifcom.Entidades.Factory;

import java.io.BufferedReader;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.EntityNotFoundException;
import com.google.appengine.api.datastore.KeyFactory;
import com.google.appengine.api.datastore.PreparedQuery;
import com.google.appengine.repackaged.org.json.JSONException;
import com.google.appengine.repackaged.org.json.JSONObject;
import com.googlecode.objectify.Key;

import sifcom.Entidades.Socio;
import sifcom.Utilidades.Utilidades;
import sifcom.json.ManejoJson;

public class Socios {
	
	public Socios()
	{
		
	}
	
	public Socios(BufferedReader reader) throws JSONException, EntityNotFoundException
	{
		ObjectifyGenericDao<Socio> socioDao = new ObjectifyGenericDao<Socio>(Socio.class);
		Utilidades util = new Utilidades();
		
		JSONObject jsonSocio = util.getJsonObject(reader);
		
			//Delete
			if(jsonSocio.length() == 1 && jsonSocio.get("id") != null)
			{
				//Entity socio = util.getEntity(jsonSocio.get("id").toString());	
				Key<Socio> key = new Key<Socio>(Socio.class, new Long(jsonSocio.get("id").toString()));
				Socio socio = socioDao.get(key);
				//datastore.delete(socio.getKey());
				socioDao.delete(socio);
			}
			
			//Create
			if(jsonSocio.length() > 1 && jsonSocio.get("id").toString().length() == 4)
			{
			//Entity Socio = new Entity("Socio");
			//this.setProperties(Socio, jsonSocio);	
			//datastore.put(Socio);
				Socio socio = new Socio();
				//this.setProperties(socio, jsonSocio);
				ManejoJson<Socio> mson = new ManejoJson<Socio>(Socio.class);
				mson.setData(socio, jsonSocio);
				socioDao.put(socio);
				//socio.
			}
		
			//Update
			if(jsonSocio.length() > 1 && jsonSocio.get("id").toString().length() > 4 && jsonSocio.get("id") != null)
			{
				/*Entity socio = util.getEntity(jsonSocio.get("id").toString());	
				this.setProperties(socio, jsonSocio);
				datastore.put(socio);*/
				
				Key<Socio> key = new Key<Socio>(Socio.class,jsonSocio.getLong("id"));
				Socio socio = socioDao.get(key);
				//this.setProperties(socio, jsonSocio);
				ManejoJson<Socio> mson = new ManejoJson<Socio>(Socio.class);
				mson.setData(socio, jsonSocio);
				socioDao.put(socio);
				
			}
	}
	
	public String getDataSocio(){
		/*DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
		Query q = new Query("Socio");

		PreparedQuery pq = datastore.prepare(q);
		
		return setDataJson(pq);*/
		
		ObjectifyGenericDao<Socio> socioDao = new ObjectifyGenericDao<Socio>(Socio.class);		
		
		List<Socio> lstSocio = socioDao.listByExample(new Socio());
		//return new JSONArray(lstSocio).toString();
		ManejoJson<Socio> mjson = new ManejoJson<Socio>(Socio.class);
		return mjson.setData(lstSocio);
	}

	public String SearchSocio(String ced,String nombres, String apellidos){
		/*DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
		Query q = new Query("Socio");
		if(ced.length()>=1)
		q.addFilter("cedula_ruc", Query.FilterOperator.GREATER_THAN_OR_EQUAL, ced);
		if(nombres.length()>=1)
		q.addFilter("nombres", Query.FilterOperator.GREATER_THAN_OR_EQUAL, nombres);
		if(apellidos.length()>=1)
		q.addFilter("apellidos", Query.FilterOperator.GREATER_THAN_OR_EQUAL, apellidos);
		
		PreparedQuery pq = datastore.prepare(q);*/
		
		ObjectifyGenericDao<Socio> socioDao = new ObjectifyGenericDao<Socio>(Socio.class);
		//socioDao.listByProperty(propName, propValue)
		Socio socio = new Socio();
		if(ced.length()>=1)
		socio.setCedula_ruc(ced);
		if(nombres.length()>=1)
			socio.setNombres(nombres);
		if(apellidos.length()>=1)
			socio.setApellidos(apellidos);
		
		List<Socio> lstSocio = socioDao.listByExample(socio);
		//return new JSONArray(lstSocio).toString();
		ManejoJson<Socio> mjson = new ManejoJson<Socio>(Socio.class);
		
		//return setData(lstSocio);
		return mjson.setData(lstSocio);
		//return setDataJson2(pq);
	}	
	
	private String setData(List<Socio> lstSocio)
	{
		JSONObject json = new JSONObject();
		List<String> array= new ArrayList<String>();
		
		for(Socio socio : lstSocio)
		{
			
		for (Field field : Socio.class.getDeclaredFields())
		{
			field.setAccessible(true);

			Object value;
			try
			{
				value = field.get(socio);
			}
			catch (IllegalArgumentException e)
			{
				throw new RuntimeException(e);
			}
			catch (IllegalAccessException e)
			{
				throw new RuntimeException(e);
			}
			if (value != null)
			{
				try {
					json.put(field.getName(), value);							
				} catch (JSONException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}	
		
		array.add(json.toString());
		
		}
		
		String myOut = "{\"success\":true,\"message\":\"Load Data 2\",\"data\":"+array.toString()+"}"; 
		
		return myOut;
	}
	
	private void setProperties(Socio socio,JSONObject jsonSocio)
	{
		try{
			if(!jsonSocio.isNull("tipo_pers")) 
				socio.setTipo_pers((Long) jsonSocio.get("tipo_pers"));
			
			if(!jsonSocio.isNull("cedula_ruc"))
				socio.setCedula_ruc((String) jsonSocio.get("cedula_ruc"));
			
			if(!jsonSocio.isNull("apellidos"))
				socio.setApellidos((String) jsonSocio.get("apellidos"));
			
			if(!jsonSocio.isNull("tipo_id"))
				socio.setTipo_id((String) jsonSocio.get("tipo_id"));
			
			if(!jsonSocio.isNull("no_seguro"))
				socio.setNo_seguro((String) jsonSocio.get("no_seguro"));
			
			if(!jsonSocio.isNull("nombres"))
				socio.setNombres((String) jsonSocio.get("nombres"));
			
			if(!jsonSocio.isNull("genero"))
				socio.setGenero((Long) jsonSocio.get("genero"));
			
			if(!jsonSocio.isNull("provincia"))
				socio.setProvincia((String) jsonSocio.get("provincia"));
			
			if(!jsonSocio.isNull("sector"))
				socio.setSector((String) jsonSocio.get("sector"));
			
			if(!jsonSocio.isNull("f_nac"))
				socio.setF_nac((String) jsonSocio.get("f_nac"));
			
			if(!jsonSocio.isNull("canton"))
				socio.setCanton((Long) jsonSocio.get("canton"));
			
			if(!jsonSocio.isNull("comunidad"))
				socio.setComunidad((String) jsonSocio.get("comunidad"));
			
			if(!jsonSocio.isNull("estado_civil"))
				socio.setEstado_civil((Long) jsonSocio.get("estado_civil"));
			
			if(!jsonSocio.isNull("parroquia"))
				socio.setParroquia((String) jsonSocio.get("parroquia"));
			
			if(!jsonSocio.isNull("telefono"))
				socio.setTelefono((String) jsonSocio.get("telefono"));
			
			if(!jsonSocio.isNull("educacion"))
				socio.setEducacion((String) jsonSocio.get("educacion"));
			
			if(!jsonSocio.isNull("direccion"))
				socio.setDireccion((String) jsonSocio.get("direccion"));
			
			if(!jsonSocio.isNull("celular"))
				socio.setCelular((String) jsonSocio.get("celular"));
			
			if(!jsonSocio.isNull("trabajo_ocupacion"))
				socio.setTrabajo_ocupacion((String) jsonSocio.get("trabajo_ocupacion"));
			
			if(!jsonSocio.isNull("representante"))
				socio.setRepresentante((Long) jsonSocio.get("representante"));
			
			if(!jsonSocio.isNull("beneficiario"))
				socio.setBeneficiario((String) jsonSocio.get("beneficiario"));
			
			if(!jsonSocio.isNull("trabajo_profesion"))
				socio.setTrabajo_profesion((String) jsonSocio.get("trabajo_profesion"));
			
			if(!jsonSocio.isNull("trabajo_empresa"))
				socio.setTrabajo_empresa((String) jsonSocio.get("trabajo_empresa"));
			
			if(!jsonSocio.isNull("trabajo_direccion"))
				socio.setTrabajo_direccion((String) jsonSocio.get("trabajo_direccion"));
			
			if(!jsonSocio.isNull("trabajo_telefono"))
				socio.setTrabajo_telefono((String) jsonSocio.get("trabajo_telefono"));
			
			if(!jsonSocio.isNull("conyuge_identificacion"))
				socio.setConyuge_identificacion((String) jsonSocio.get("conyuge_identificacion"));
			
			if(!jsonSocio.isNull("conyuge_apellidos"))
				socio.setConyuge_apellidos((String) jsonSocio.get("conyuge_apellidos"));
			
			if(!jsonSocio.isNull("conyuge_nombre"))
				socio.setConyuge_nombre((String) jsonSocio.get("conyuge_nombre"));		
	}
	catch(JSONException ex)
	{
		ex.printStackTrace();
	}
	}

	private String setDataJson(PreparedQuery pq)
	{
		JSONObject json = new JSONObject();
		List<String> js= new ArrayList<String>();		
		try{
		for (Entity result : pq.asIterable()) {
			json.put("id", KeyFactory.keyToString(result.getKey())); //KeyFactory.keyToString(
			json.put("tipo_pers", result.getProperty("tipo_pers"));
			json.put("cedula_ruc", result.getProperty("cedula_ruc"));
			json.put("apellidos", result.getProperty("apellidos"));
			json.put("tipo_id", result.getProperty("tipo_id"));
			json.put("no_seguro", result.getProperty("no_seguro"));
			json.put("nombres", result.getProperty("nombres"));
			json.put("genero", result.getProperty("genero"));
			json.put("provincia", result.getProperty("provincia"));
			json.put("sector", result.getProperty("sector"));
			json.put("f_nac", result.getProperty("f_nac"));
			json.put("canton", result.getProperty("canton"));
			json.put("comunidad", result.getProperty("comunidad"));
			json.put("estado_civil", result.getProperty("estado_civil"));
			json.put("parroquia", result.getProperty("parroquia"));
			json.put("telefono", result.getProperty("telefono"));
			json.put("educacion", result.getProperty("educacion"));
			json.put("direccion", result.getProperty("direccion"));
			json.put("celular", result.getProperty("celular"));
			json.put("trabajo_ocupacion", result.getProperty("trabajo_ocupacion"));
			json.put("representante", result.getProperty("representante"));
			json.put("beneficiario", result.getProperty("beneficiario"));
			json.put("trabajo_profesion", result.getProperty("trabajo_profesion"));
			json.put("trabajo_empresa", result.getProperty("trabajo_empresa"));
			json.put("trabajo_direccion", result.getProperty("trabajo_direccion"));
			json.put("trabajo_telefono", result.getProperty("trabajo_telefono"));
			json.put("conyuge_identificacion", result.getProperty("conyuge_identificacion"));
			json.put("conyuge_apellidos", result.getProperty("conyuge_apellidos"));
			json.put("conyuge_nombre", result.getProperty("conyuge_nombre"));
			js.add(json.toString());
		}
		
		String myOut = "{\"success\":true,\"message\":\"Load Data\",\"data\":"+js.toString()+"}"; 
		
		return myOut;
		}
		catch(JSONException ex)
		{
			ex.printStackTrace();
			return null;
		}		
	}

	private String setDataJson2(PreparedQuery pq)
	{
		JSONObject json = new JSONObject();
		List<String> js= new ArrayList<String>();		
		try{
		for (Entity result : pq.asIterable()) {
			json.put("id", KeyFactory.keyToString(result.getKey())); //KeyFactory.keyToString(
			json.put("tipo_pers", result.getProperty("tipo_pers"));
			json.put("cedula_ruc", result.getProperty("cedula_ruc"));
			json.put("apellidos", result.getProperty("apellidos"));
			json.put("tipo_id", result.getProperty("tipo_id"));
			json.put("no_seguro", result.getProperty("no_seguro"));
			json.put("nombres", result.getProperty("nombres"));
			json.put("genero", result.getProperty("genero"));
			json.put("provincia", result.getProperty("provincia"));
			json.put("sector", result.getProperty("sector"));
			json.put("f_nac", result.getProperty("f_nac"));
			json.put("canton", result.getProperty("canton"));
			json.put("comunidad", result.getProperty("comunidad"));
			json.put("estado_civil", result.getProperty("estado_civil"));
			json.put("parroquia", result.getProperty("parroquia"));
			json.put("telefono", result.getProperty("telefono"));
			json.put("educacion", result.getProperty("educacion"));
			json.put("direccion", result.getProperty("direccion"));
			json.put("celular", result.getProperty("celular"));
			json.put("trabajo_ocupacion", result.getProperty("trabajo_ocupacion"));
			json.put("representante", result.getProperty("representante"));
			json.put("beneficiario", result.getProperty("beneficiario"));
			json.put("trabajo_profesion", result.getProperty("trabajo_profesion"));
			json.put("trabajo_empresa", result.getProperty("trabajo_empresa"));
			json.put("trabajo_direccion", result.getProperty("trabajo_direccion"));
			json.put("trabajo_telefono", result.getProperty("trabajo_telefono"));
			json.put("conyuge_identificacion", result.getProperty("conyuge_identificacion"));
			json.put("conyuge_apellidos", result.getProperty("conyuge_apellidos"));
			json.put("conyuge_nombre", result.getProperty("conyuge_nombre"));
			js.add(json.toString());
		}
		
		String myOut = "{\"success\":true,\"message\":\"SEarch\",\"data\":"+js.toString()+"}"; 
		
		return myOut;
		}
		catch(JSONException ex)
		{
			ex.printStackTrace();
			return null;
		}		
	}	
	
}
